#ifndef MESSAGE_H
#define MESSAGE_H

#include <QByteArray>
#include <QString>

// ------------------------------------------------------------------------------------------------
// 用户信息
// ------------------------------------------------------------------------------------------------
struct UserInfo
{
    QString m_userId = "";          // 用户编号
    QString m_nickName = "";        // 昵称
    QString m_avatar = "";          // 头像
    QString m_gender = "";          // 性别
    QString m_email = "";           // 邮箱
    QString m_password = "";        // 密码
    QString m_phone = "";           // 电话
    QString m_address = "";         // 地址
    QString m_description = "";     // 描述
};

// ------------------------------------------------------------------------------------------------
// 消息信息
// ------------------------------------------------------------------------------------------------
enum MessageType : int
{
    TextType = 1,
    ImageType = 2,
    FileType = 3
};

class Message 
{
public:
    QString m_messageId = "";		// 消息的编号
    QString m_chatSessionId = "";	// 消息所属会话的编号
    QString m_time = "";			// 消息的时间. 通过 "格式化" 时间的方式来表示. 形如 06-07 12:00:00
    MessageType m_messageType;      // 消息类型
    UserInfo m_sender;              // 发送者的信息 
    QByteArray m_content;           // 消息的正文内容
    QString m_fileId = "";          // 文件的身份标识. 当消息类型为 文件,图片... 的时候, 才有效. 当消息类型为 文本, 则为 ""
    QString m_fileName = "";        // 文件名称. 只是当消息类型为 图片,文件... 消息, 才有效. 其他消息均为 ""
    QString m_fileSize = "";        // 文件大小. 只是当消息类型为 图片,文件... 消息, 才有效. 其他消息均为 ""
public:
    Message(const QString& messageId, MessageType messageType, const UserInfo& sender, const QString& chatSessionId, const QByteArray& content, const QString& fileName, const QString& fileSize);
};

class TextMessage : public Message
{
public:
    TextMessage(const QString& messageId, const UserInfo& sender, const QString& chatSessionId, const QByteArray& content);
};

class ImageMessage : public Message
{
public:
    ImageMessage(const QString& messageId, const UserInfo& sender, const QString& chatSessionId, const QByteArray& content, const QString& fileName, const QString& fileSize);
};

class FileMessage : public Message
{
public:
    FileMessage(const QString& messageId, const UserInfo& sender, const QString& chatSessionId, const QByteArray& content, const QString& fileName, const QString& fileSize);
};

// 消息工厂
class MessageFactory
{
public:
    static std::shared_ptr<Message> makeMessage(MessageType messageType, const QString& chatSessionId, const UserInfo& sender, const QByteArray& content, const QString& fileName, const QString& fileSize);
};


// 设置

class Setting
{
public:
    static Setting* getInstance()
    {
        static Setting instance;
        return &instance;
    }

    QString m_messageContentFontFamily = "微软雅黑";
    int m_messageContentFontSize = 16;


};

#endif // MESSAGE_H
